#if 0
../src/Token.cc: In member function ‘std::__cxx11::string Token::generateToken() const’:
../src/Token.cc:23:59: warning: ‘unsigned char* MD5(const unsigned char*, size_t, unsigned char*)’ is deprecated: Since OpenSSL 3.0 [-Wdeprecated-declarations]
     MD5((const unsigned char*)tmp.c_str(), tmp.size(), md5);
                                                           ^
In file included from ../src/Token.cc:2:0:
/usr/local/include/openssl/md5.h:52:38: note: declared here
 OSSL_DEPRECATEDIN_3_0 unsigned char *MD5(const unsigned char *d, size_t n,

根据警告信息，代码中使用的 MD5 函数在 OpenSSL 3.0 版本中已被弃用，因此产生了编译警告。警告还提供了相关函数的声明位置。
在 OpenSSL 3.0 中，MD5 函数被弃用，推荐使用 EVP 接口来执行散列操作。您可以使用 EVP_MD_CTX_new 函数创建一个 MD5 上下文对象，
然后使用 EVP_DigestInit_ex、EVP_DigestUpdate 和 EVP_DigestFinal_ex 函数来计算 MD5 散列值。
#endif

#include "../include/Token.h"
#include <openssl/md5.h> // for MD5
// -lssl -lcrypto

Token::Token(const string& username_, const string& salt_)
    : username(username_), salt(salt_)
{}

// 先根据salt和username生成md5
// 然后md5 + 时间 -> token
string Token::generateToken() const {
    string tmp = salt + username;

    // $ md5sum home.html 
    // fecd68c16d22699ebd4e44cb61e9f602  home.html
    // 32个字符，但是使用十六进制，一个字节可以表示2个字符
    // 在 OpenSSL 中，MD5 散列算法生成的散列值长度固定为 16 字节
    unsigned char md5[MD5_DIGEST_LENGTH] = { 0 };

    // 第一个参数：指向要计算md5码的数据的指针
    // 第二个参数：要计算md5码的数据的长度
    // 第三个参数：存储md5码的缓冲区的指针
    MD5((const unsigned char*)tmp.c_str(), tmp.size(), md5);

    // fragment 用于存储每个散列结果的两位十六进制表示。
    char fragment[3] = { 0 };
    string res;
    for (int i = 0; i < 16; ++i) {
        sprintf(fragment, "%02x", md5[i]);
        res += fragment;
    }

    // 获取当前时间
    time_t secs = time(0);
    struct tm* ptm = localtime(&secs);

    // buf 用于存储格式化后的时间
    // 4 + 2 + 2 + 2 + 2 + 2 = 14
    // 年  月  日  时  分  秒
    char buf[15] = { 0 };
    sprintf(buf, "%04d%02d%02d%02d%02d%02d",
            ptm->tm_year + 1900,
            ptm->tm_mon + 1,
            ptm->tm_mday,
            ptm->tm_hour,
            ptm->tm_min,
            ptm->tm_sec);

    return res + buf;
}
